<?php
/**
 * Yotaku Shop - yshop
 * @author Creatint<creatint@163.com>
 * @copyright www.yotaku.cn 2016
 */
namespace Admin\Model;
use Common\Model\Model;
class AdminModel extends Model{
    protected $error = '';
    /* 用户模型自动验证 */
    protected $_validate = array(
        /* 验证用户名 */
        array('username', '1,30', '用户名1~30个字符', self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
//        array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), //用户名禁止注册
        array('username', '', '用户名被占用', self::EXISTS_VALIDATE, 'unique'), //用户名被占用

        /* 验证密码 */
        array('password', '3,30', '密码长度3~30个字符', self::EXISTS_VALIDATE, 'length'), //密码长度不合法

//        /* 验证邮箱 */
//        array('email', 'email', -5, self::EXISTS_VALIDATE), //邮箱格式不正确
//        array('email', '1,32', -6, self::EXISTS_VALIDATE, 'length'), //邮箱长度不合法
////        array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), //邮箱禁止注册
//        array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), //邮箱被占用

    );
    /* 用户模型自动完成 */
    protected $_auto = array(
        array('password', 'yotaku_md5', self::MODEL_BOTH, 'function'),
        array('reg_time', NOW_TIME, self::MODEL_INSERT),
        array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
        array('update_time', NOW_TIME),
        array('status', 1, self::MODEL_INSERT,),
    );

    public function _initialize()
    {
        parent::_initialize(); // TODO: Change the autogenerated stub
        $this->id('uid');
    }

    public function updateUsername($data){
        if($data = $this->create($data)){
            unset($data['password']);
            if($this->save($data)){
                return true;
            }else{
                $this->error = '保存失败';
            }
        }else{
            $this->error = '字段不正确';
        }
    }
    public function updatePassword($data){
        if($data = $this->create($data)){
            trace($data,'data');
//            return;
            if($this->save($data)){
                return true;
            }
            trace($this->getLastSql(),'sql');
        }
        trace($this->getError(),'error');
        return false;
    }

    /**
     * 注册一个新用户
     * @param  string $username 用户名
     * @param  string $nickname 昵称
     * @param  string $password 用户密码
     * @param  string $email    用户邮箱
     * @return integer          注册成功-用户信息，注册失败-错误编号
     */
    public function register($username, $nickname, $password, $email){
        $data = array(
            'username' => $username,
            'nickname' => $nickname,
            'password' => $password,
            'email'    => $email,
        );

        /* 添加用户 */
        if($this->create($data)){
            $uid = $this->add();
            return $uid ? $uid : 0; //0-未知错误，大于0-注册成功
        } else {
            return $this->getError(); //错误详情见自动验证注释
        }
    }


    /**
     * 用户登录认证
     * @param  string  $username 用户名
     * @param  string  $password 用户密码
     * @param  integer $type     用户名类型 （1-用户名，2-邮箱，3-手机，4-UID）
     * @return integer           登录成功-用户ID，登录失败-错误编号
     */
    public function login($username, $password, $type = 1){
        $map = array();
        switch ($type) {
            case 1:
                $map['username'] = $username;
                break;
            case 2:
                $map['email'] = $username;
                break;
            case 3:
                $map['mobile'] = $username;
                break;
            case 4:
                $map['id'] = $username;
                break;
            default:
                return 0; //参数错误
        }

        /* 获取用户数据 */
        $user = $this->where($map)->find();
        if(is_array($user) && $user['status']){

            /* 验证用户密码 */
            if(yotaku_md5($password, YOTAKU_AUTH_KEY) === $user['password']){
                $this->autoLogin($user);
                return $user; //登录成功，返回用户ID
            } else {
                return -2; //密码错误
            }
        } else {
            return -1; //用户不存在或被禁用
        }
    }


    /**
     * 自动登录用户
     * @param  integer $user 用户信息数组
     */
    private function autoLogin($user){
        /* 更新登录信息 */
        $data = array(
            'login'           => array('exp', '`login`+1'),
            'last_login_time' => NOW_TIME,
            'last_login_ip'   => get_client_ip(1),
        );
        $this->where("uid={$user['uid']}")->save($data);

        /* 记录登录SESSION和COOKIES */
        $auth = array(
            'uid'             => $user['uid'],
            'username'        => $user['username'],
            'last_login_time' => $user['last_login_time'],
        );

        session('user_auth', $auth);
        session('user_auth_sign', data_auth_sign($auth, C('')));

    }

    /**
     * 注销当前用户
     * @return void
     */
    public function logout(){
        session('user_auth', null);
        session('user_auth_sign', null);
    }


    public function remove($id){
        if ( !$id ) {
            $this->error = '待删除项为空';
            return false;
        }

        if (is_numeric($id)) {
            $id = (array)(int)$id;
        } else if ( is_string($id) && strpos($id, ',') > 0) {
            $id = preg_split('/[,，;\r\n]+/', trim($id, ",，;\r\n"));
        }

        if ( !$id ) {
            $this->error = '待删除项为空';
            return false;
        }
        $map = [
            'uid'=>[
                'IN',
                $id
            ]
        ];

        if ( $this->where($map)->delete() ) {
            return true;
        } else {
            return false;
        }
    }

    public function getNickName($uid){
        return $this->where(array('uid'=>(int)$uid))->getField('nickname');
    }

    public function getError(){
        return $this->error;
    }

}